package result

import (
	"errors"
	"github.com/gin-gonic/gin"
	"net/http"
	"wrblog-api-go/pkg/errs"
	"wrblog-api-go/pkg/mylog"
	"wrblog-api-go/pkg/status"
)

type Result struct {
	Code int    `json:"code"`
	Msg  string `json:"msg"`
	Data any    `json:"data"`
}

func Res(data any, err error) *Result {
	if err != nil {
		return Fail(err)
	} else {
		return Ok(data)
	}
}

// Ok 成功返回
func Ok(data any) *Result {
	// 默认返回数据格式的结构体
	defaultData := &Result{
		Code: status.OK,
		Msg:  status.StatusMsg[status.OK],
		Data: nil,
	}
	if data != nil {
		defaultData.Data = data
	}
	return &Result{Code: defaultData.Code, Msg: defaultData.Msg, Data: defaultData.Data}
}

// Fail 失败返回
func Fail(err error) *Result {
	var e *errs.Error
	if errors.As(err, &e) {
		mylog.MyLog.Errorf("%s\n%s", e.Msg, e.Stack)
		return Wrap(e.Code, e.Msg)
	} else {
		// 默认返回数据格式的结构体
		defaultData := &Result{
			Code: status.InternalServerError,
			Msg:  status.StatusMsg[status.InternalServerError],
			Data: nil,
		}
		if e.Msg != "" {
			defaultData.Msg = e.Msg
		}
		mylog.MyLog.Errorf("系统错误！%s\n%s", e.Msg, e.Stack)
		return &Result{Code: defaultData.Code, Msg: defaultData.Msg, Data: defaultData.Data}
	}
}

// Wrap 自定义返回
func Wrap(code int, msg string) *Result {
	// 默认返回数据格式的结构体
	defaultData := &Result{
		Code: status.NoContent,
		Msg:  status.StatusMsg[status.NoContent],
		Data: nil,
	}
	if code != 0 {
		defaultData.Code = code
	}
	if msg != "" {
		defaultData.Msg = msg
	}
	return &Result{Code: defaultData.Code, Msg: defaultData.Msg, Data: defaultData.Data}
}

// Json 序列化返回
func (res *Result) Json(ctx *gin.Context) {
	ctx.JSON(http.StatusOK, res)
	ctx.Abort()
}
